package com.javaobj.common.convert;

import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 将 D 转换成 V 工具类接口
 * @param <D>
 * @param <V>
 */
public interface ObjectConvert<D, V> {


    /**
     * 将 D 转换成 V
     * @param dto
     * @return
     */
    V convert(D dto);

    /**
     * 将 DTO 集合转成 VO 集合
     * @param dList
     * @return
     */
    default List<V> convert(List<D> dList){
        if(dList == null || dList.isEmpty()){
            return new ArrayList<>();
        }

        return dList.stream()
                .map(this::convert)
                .collect(Collectors.toList());
    }


    /**
     * 使用 {@link BeanUtils#copyProperties(Object, Object)} 转换对象
     * @param v
     * @param <D>
     * @param <V>
     * @return
     */
    static <D, V> ObjectConvert<D, V> spring(Class<V> v){
        return new SpringObjectConvert<D, V>(v);
    }

    /**
     * 使用 {@link com.alibaba.fastjson.JSON} 转换对象
     * @param v
     * @param <D>
     * @param <V>
     * @return
     */
    static <D, V> ObjectConvert<D, V> json(Class<V> v){
        return new JsonObjectConvert<>(v);
    }


    /**
     * 使用 {@link BeanUtils#copyProperties(Object, Object)} 转换对象
     * @param obj
     * @param v
     * @param <D>
     * @param <V>
     * @return
     */
    static <D, V> V spring(D obj, Class<V> v) {
        return spring(v).convert(obj);
    }


    /**
     * 使用 {@link com.alibaba.fastjson.JSON} 转换对象
     * @param obj
     * @param v
     * @param <D>
     * @param <V>
     * @return
     */
    static <D, V> V json(D obj, Class<V> v) {
        return json(v).convert(obj);
    }


}
